package ThreadPool;

import java.util.concurrent.*;

public class ThreadPoolTest {
    public static void main(String[] args) {
//         public ThreadPoolExecutor(int corePoolSize,                      正式工
//                                    int maximumPoolSize,                  最大员工数，应大于正式工
//                                    long keepAliveTime,                   临时工闲置多久开除
//                                    TimeUnit unit,                        时间单位，秒 分 时 天
//                                    BlockingQueue<Runnable> workQueue,    客人排队的地方
//                                    ThreadFactory threadFactory,          负责招聘线程的HR
//                                    RejectedExecutionHandler handler)     忙不过来怎么办
        //1.通过ThreadPoolExecutor创建线程池对象
        ExecutorService pool =
                new ThreadPoolExecutor(3,5,8,
                        TimeUnit.SECONDS,new ArrayBlockingQueue<>(4),Executors.defaultThreadFactory(),
                        new ThreadPoolExecutor.CallerRunsPolicy());

        Runnable target = new MyRunnable();
        pool.execute(target);//线程池会自动创建一个新线程，自动处理这个任务，自动执行
        pool.execute(target);//线程池会自动创建一个新线程，自动处理这个任务，自动执行
        pool.execute(target);//线程池会自动创建一个新线程，自动处理这个任务，自动执行
//        pool.execute(target);//复用前面的核心线程
//        pool.execute(target);//复用前面的核心线程

        pool.execute(target);//创建4个线程占满线程池
        pool.execute(target);//创建4个线程占满线程池
        pool.execute(target);//创建4个线程占满线程池
        pool.execute(target);//创建4个线程占满线程池

        //线程池满了，创建临时线程
        pool.execute(target);//拽住3个线程，创建临时线程
        pool.execute(target);//拽住3个线程，创建临时线程

        //线程和线程池都满了，所以报错,
        // ThreadPoolExecutor.DiscardOldestPolicy可以将等待时间久的线程抛弃
        pool.execute(target);
//        ThreadPoolExecutor.CallerRunsPolicy()//相当于主线程（老板）亲自为客人服务


//        pool.shutdown();
//        pool.shutdownNow();

    }
}
